#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <stdbool.h>
// 协议消息处理函数类型
typedef int (*protocol_handler_t)(const uint8_t *data, uint16_t len);

// 协议消息定义
typedef struct {
    uint16_t msg_id;                // 消息ID
    const char *name;               // 消息名称
    uint16_t min_length;            // 最小长度
    uint16_t max_length;            // 最大长度
    protocol_handler_t handler;     // 处理函数
    bool need_response;             // 是否需要响应
} protocol_message_t;

typedef enum {
    MSG_HEARTBEAT = 0x0001,
    MSG_DEVICE_INFO_REQ = 0x0002,
    MSG_CONFIG_UPDATE = 0x0003,
    // 添加更多消息ID...
} message_id_t;


// 具体协议处理函数
int handle_heartbeat(const uint8_t *data, uint16_t len) {
    printf("Heartbeat received\n");
    // 发送心跳响应
    send_heartbeat_response();
    return 0;
}

int handle_device_info_request(const uint8_t *data, uint16_t len) {
    printf("Device info request\n");
    // 发送设备信息
    send_device_info();
    return 0;
}

int handle_config_update(const uint8_t *data, uint16_t len) {
    uint16_t config_id = (data[0] << 8) | data[1];
    uint16_t config_value = (data[2] << 8) | data[3];
    
    printf("Config update: ID=%d, Value=%d\n", config_id, config_value);
    update_config(config_id, config_value);
    
    // 发送确认响应
    send_ack_response(MSG_CONFIG_UPDATE);
    return 0;
}

// 数据驱动的协议消息表
static const protocol_message_t protocol_table[] = {
    // 消息ID                  消息名称                 最小长度  最大长度  处理函数                    需要响应
    {MSG_HEARTBEAT,           "Heartbeat",           0,      0,      handle_heartbeat,           true},
    {MSG_DEVICE_INFO_REQ,     "Device Info Request", 0,      0,      handle_device_info_request, true},
    {MSG_CONFIG_UPDATE,       "Config Update",       4,      4,      handle_config_update,       true},
};

#define PROTOCOL_TABLE_SIZE (sizeof(protocol_table) / sizeof(protocol_table[0]))

// 数据驱动的协议解析
int process_protocol_message(uint16_t msg_id, const uint8_t *data, uint16_t len) {
    // 查找消息处理器
    for (int i = 0; i < PROTOCOL_TABLE_SIZE; i++) {
        const protocol_message_t *msg = &protocol_table[i];
        
        if (msg->msg_id == msg_id) {
            // 检查消息长度
            if (len < msg->min_length || len > msg->max_length) {
                printf("Invalid message length for %s: %d (expected %d-%d)\n",
                       msg->name, len, msg->min_length, msg->max_length);
                return -1;
            }
            
            printf("Processing: %s\n", msg->name);
            
            // 执行消息处理
            int result = msg->handler(data, len);
            
            if (result != 0) {
                printf("Handler failed for %s: %d\n", msg->name, result);
            }
            
            return result;
        }
    }
    
    printf("Unknown message ID: 0x%04x\n", msg_id);
    return -1;
}